# TODO: 备选数字有哪些？
numQueue = []
# 用来回溯的栈
resultStack = []
# TODO: check point的格子有哪些？
checkPoint = []

ROWS = 3
COLS = 3

SUM = 15

# TODO: 如何初始化棋盘？
def InitBoard():
    return []

board = InitBoard()

# TODO: 如何从索引转化为行列组合？
def GetRowColFromIndex(idx):
    return 0, 0

# TODO: 如何判断即将要放置的数字是否可以放在这个格子里？
# cur_index: 当前考察的格子的索引
# val: 当前打算放在格子里的数字
def IsFillingValueValid(cur_index, val):
    return True

# TODO：如何获取比传入数字大并且尽可能接近传入的数字，而且还没有使用过的数字？
# 如果找到合适的数字则返回它，否则就返回-1
def GetBiggerUnusedNum(num):
    return -1

# TODO: 遇到check point格子的时候，计算这个格子应该放什么数字
# 如果计算得到的数字在备选容器里,则返回它，否则返回-1
def CalcCheckPointNum(curIndex):
    return -1

# TODO: 向指定格子放置一个数字
# 放置一个数字的时候不是简单的修改board上对应行列的值，而有三件事要处理，想想看是那三件事
def PutNum(curIndex, num):
    pass

def main():
    global board, numQueue
    # 当前要填的格子
    curIndex = 0

    while len(numQueue) > 0:
        # 如果index in checkPoint，则自动补最后一个数字
        r, c = GetRowColFromIndex(curIndex)
        # 是否需要回溯的标志
        needRollBack = False

        if board[r][c] == 0:
            # TODO：如果考察的格子为空格，应该进行哪些处理？
            num = min(numQueue)

            if needRollBack == True:
                # TODO：如果需要回溯的时候，需要做那些处理？              
                pass
            else:
                # TODO：不需要回溯的时候，需要做那些处理？
                pass

    # TODO：输出找到的九宫格组合：
    pass

main()